package com.xbongbong.paas.pojo;

import com.xbongbong.paas.enums.EnableEnum;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;
import java.util.List;

/**
 * @author zcp
 * @version v1.0
 * @since v1.0
 */
@Getter
@Setter
@ToString
public class StageFindPojo implements Serializable {
    private static final long serialVersionUID = 1629670478959556155L;
    /**
     * 表单id，现在机会阶段的表单id都为null
     */
    private Long formId;
    /**
     * 阶段流程版本id
     */
    private Long stageProcessId;
    /**
     * 是否启用，当该值为null，则获取所有
     */
    private EnableEnum enableEnum;
    /**
     * @see com.xbongbong.paas.enums.StageTypeEnum
     * 要统计的类型：阶段类型(对客户来说：0普通、1成交、2流失；对机会来说：0其他普通类型，1赢单，2输单，3取消)
     */
    private List<Integer> typeIn;
    /**
     * 要统计的阶段code集合（阶段级联筛选）
     */
    private List<String> codeIn;


    public StageFindPojo(){
    }

    /**
     * 只限制form：获取某种业务当前模板的所有阶段
     * 【使用场景】，比如bi报表内某个模板的阶段数据
     * @param formId 模板id
     */
    public StageFindPojo(Long formId){
        //stageProcessId、enableEnum、typeIn都为null
        this.formId = formId;
    }
    /**
     * 不限制form、版本、enable：获取某种类型的全部（启用and关闭）阶段
     * 【使用场景】，比如工作报告机会统计、机会提醒push、全景图客户跟进提示
     * @param typeIn 阶段类型集合
     */
    public StageFindPojo(List<Integer> typeIn){
        //formId、stageProcessId、enableEnum都为null
        this.typeIn = typeIn;
    }

    /**
     * 不限制类型，只限制formId、stageProcessId、enable（强制默认为open）条件：获取某个form、某个版本下启用的所有类型阶段
     * 【使用场景】，比如机会漏斗、客户漏斗等
     * @param formId 表单id
     * @param stageProcessId 流程版本id
     */
    public StageFindPojo(Long formId, Long stageProcessId){
        //typeIn 为null
        this.formId = formId;
        this.stageProcessId = stageProcessId;
        this.enableEnum = EnableEnum.OPEN;
    }

    /**
     * 不限制版本、enable：获取某个form全部（启用and关闭）的某种类型阶段
     * 【使用场景】，输单、赢单、到期、跟进机会统计等
     * @param formId 表单id
     * @param typeIn 阶段类型集合
     */
    public StageFindPojo(Long formId, List<Integer> typeIn){
        //estageProcessId、enableEnum为null
        this.formId = formId;
        this.typeIn = typeIn;
    }

    /**
     * 不限制enable：获取某个form、某个版本全部（启用and关闭）的某种类型阶段
     * 【使用场景】，赢单、首页机会（到期）统计、应该销售机会状态、阶段变更分析等
     * @param formId 表单id
     * @param typeIn 阶段类型集合
     */
    public StageFindPojo(Long formId, Long stageProcessId, List<Integer> typeIn){
        //enableEnum为null
        this.formId = formId;
        this.stageProcessId = stageProcessId;
        this.typeIn = typeIn;
    }
    /**
     * 不限制stageProcessId、enable：获取某个form 全部（启用and关闭）的某种类型、某些code的阶段
     * 【使用场景】，有阶段级联筛选的PK新增机会
     * @param formId 表单id
     * @param typeIn 阶段类型集合
     */
    public StageFindPojo(Long formId, List<Integer> typeIn, List<String> codeIn){
        //stageProcessId、enableEnum为null
        this.formId = formId;
        this.typeIn = typeIn;
        this.codeIn = codeIn;
    }
    /**
     * 不限制enable：获取某个form、某个版本全部（启用and关闭）的某种类型、某些code的阶段
     * 【使用场景】，有阶段级联筛选的新增、预计机会
     * @param formId 表单id
     * @param typeIn 阶段类型集合
     */
    public StageFindPojo(Long formId, Long stageProcessId, List<Integer> typeIn, List<String> codeIn){
        //enableEnum为null
        this.formId = formId;
        this.stageProcessId = stageProcessId;
        this.typeIn = typeIn;
        this.codeIn = codeIn;
    }

    /**
     * 阶段级联筛选（剔除特定类型）
     * @param formId
     * @param stageProcessId
     * @param enableEnum
     * @param typeIn
     */
    public StageFindPojo(Long formId, Long stageProcessId, EnableEnum enableEnum, List<Integer> typeIn){
        this.formId = formId;
        this.stageProcessId = stageProcessId;
        this.enableEnum = enableEnum;
        this.typeIn = typeIn;
    }
}
